PORTFÓLIO DE R
Este R Markdown (“bloco de notas” extremamente avançado do RStudio e outras IDE de R) tem o objetivo de resumir minha experiência pessoal com a linguagem R.
Minha base de conhecimento é predominantemente marcada pelas aulas de R para Inteligência Artificial, no curso de MBA em IA e Machine Learning da FIAP, e que foram ministradas pelo mestre Elthon Manhas de Freitas, entre outubro de 2019 e janeiro de 2020.
Apesar da carga de aula de apenas 28h e adicionadas às horas investidas com trabalhos, pesquisas e exercícios, posso dizer que na jornada de projetos com IA, o R será um companheiro de viagem. Mesmo não sendo um especialista em R, Estatística e Análise Exploratória, o que me alegra é que tenho condições de saber quando usar o R e o que ele pode me ajudar na evolução tecnológica envolvendo engenharia, ciência e análise de DADOS.
Como estou usando um R Markdown, que é basicamente uma formato de arquivo que permite criar análises em R em forma de documentos, relatórios e apresentações, nos próximos parágrafos tentarei colocar instruções gerais e códigos para uso do R na prática.
O R é uma evolução da linguagem S. O S teve seu início com o desenvolvimento de John Chambers em 1976 e se tornou uma ferramenta reconhecida para finalidades cientíticas, porém não era Open Source e só estava disponível em pacotes comerciais. Então o R, “criado” por Ross Ihaka e Robert Gentleman (olha o porquê do R… :-) ), teve sua primeira publicação em 1993 e tornou-se software livre GNU em 1995.
O R é uma linguagem de programação interpretada e não compilada e os dados ficam em memória. Com isso, para laços e outra funcionalidades é uma linguagem de processamento mais lenta. Muito utilizada em análise exploratória de dados, estatística, matemática e para a finalidade que eu estou mais interessado neste momento, para uso com Inteligência Artificial. Sabendo que todos os outros conceitos são base para entender a IA :-).
IDE (Integrated Development Environment ou Ambiente de Desenvolvimento Integrado) para uso do R que mais utilizei foi o RStudio.
RStudio: é um software Open Source para uso da linguagem R. Em linhas gerais ele tem 4 áreas principais. - Source: Onde criamos os scripts em R, podendo ser o formato R Script, Rmd R Markdown (exatamente como este), entre outros. Os código criados nesta área podem ser executados, assim passa a fazer uso de outros áreas, como o “Console” e o “Environment”. - Console: é a área onde os códigos são executados, então quando “rodamos” um R Script, basicamente é no console que ele é carregado para execução. É possível também criar um código diretamente nesta área, assim como um prompt de comando do Windows por exemplo. Isto é útil quando queremos ver um resultado ou testar algum código antes de fato criá-lo na área de Source. - Environmnent: é a área onde carregamos as variáveis quando executamos um código. Estas variáveis podem ser de vários tipos: como um vetor, uma matriz, uma string, um número, Data frame, entre outros tipos de dados do R. Você também consegue visualizar os valores de tais variáveis. - Files/Plots/Packages/Help: É a área onde podemos abrir os arquivos para a área de Source, apresentar gráficos gerados pela Console, Instalar pacotes padrões e customizados do R, além da área de ajuda (Help) do software e suas funções.
Abaixo seguem as configurações de aparência que deixei no meu RStudio:
Para mais informações sobre o RStudio e fazer download da instalação, tanto para Windows, Mac ou Linux acesse o site abaixo: https://rstudio.com/
Existe uma opção de usar o RStudio via Web, sem a necessidade de instalar localmente, pelo endereço abaixo: https://rstudio.cloud/
Existem vários pacotes para R, que trazem funções e bibliotecas para facilitar manipulação de dados, construção de dados, conectividade, interação e visualização, além de várias outras facilidades.
Os pacotes são administrados e disponibilizados pela R Foundation no seguinte endereço: https://cran.r-project.org/
Neste site também são encontradas outras instalações necessárias para funcionamento do R localmente, como o RTools.
Usando o RStudio, o direcionamento para este diretório da Web é automático, então para instalar pacotes, basta utilizar a instrução ‘install.packages(#nome do pacote#)’.
A seguir vamos fazer a instalação de vários pacotes do R. Alguns são utilizados neste Portfólio.
#Pacotes importantes para uso do R:
install.packages(‘swirl’) install.packages(‘gridExtra’) install.packages(‘corrplot’) install.packages(‘readr’) install.packages(‘data.table’) install.packages(‘tidyr’) install.packages(‘forcats’) install.packages(‘ggrepel’) install.packages(‘ggridges’) install.packages(‘ggExtra’) install.packages(‘ggforce’) install.packages(‘viridis’) install.packages(‘broom’) install.packages(‘lubridate’) install.packages(‘timeDate’) install.packages(‘tseries’) install.packages(‘forecast’) install.packages(‘prophet’) install.packages(‘timetk’) install.packages(‘geosphere’) install.packages(‘leaflet’) install.packages(‘leaflet.extras’) install.packages(‘dplyr’) install.packages(‘plotly’) install.packages(‘plot3D’) install.packages(‘readxl’) install.packages(‘fractional’)
E abaixo a sequência para carregar os pacotes no ambiente do R, para uso nos códigos que virão a seguir.
# Pacotes para visualização
library('ggplot2') # visualisation
library('scales') # visualisation
library('grid') #
library('gridExtra') # visualisation
library('RColorBrewer') # visualisation
library('corrplot') # visualisation
## corrplot 0.84 loaded
# Pacotes para manipulação de dados
library('dplyr') # data manipulation
## Warning: package 'dplyr' was built under R version 3.6.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library('readr') # input/output
##
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
##
## col_factor
library('data.table') # data manipulation
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:dplyr':
##
## between, first, last
library('tibble') # data wrangling
library('tidyr') # data wrangling
library('stringr') # string manipulation
library('forcats') # factor manipulation
library('lazyeval') # data wrangling
library('broom') # data wrangling
library('purrr') # string manipulation
##
## Attaching package: 'purrr'
## The following objects are masked from 'package:lazyeval':
##
## is_atomic, is_formula
## The following object is masked from 'package:data.table':
##
## transpose
## The following object is masked from 'package:scales':
##
## discard
library('readxl') #file manipulation
# Pacotes específicos para visualização
library('ggrepel') # visualisation
library('ggridges') # visualisation
library('ggExtra') # visualisation
library('ggforce') # visualisation
library('viridis') # visualisation
## Loading required package: viridisLite
##
## Attaching package: 'viridis'
## The following object is masked from 'package:scales':
##
## viridis_pal
# Pacotes de predição, série temporal
library('lubridate') # date and time
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:data.table':
##
## hour, isoweek, mday, minute, month, quarter, second, wday, week,
## yday, year
## The following object is masked from 'package:base':
##
## date
library('timeDate') # date and time
library('tseries') # time series analysis
## Registered S3 method overwritten by 'xts':
## method from
## as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library('forecast') # time series analysis
## Registered S3 methods overwritten by 'forecast':
## method from
## fitted.fracdiff fracdiff
## residuals.fracdiff fracdiff
library('prophet') # time series analysis
## Loading required package: Rcpp
## Loading required package: rlang
## Warning: package 'rlang' was built under R version 3.6.3
##
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
##
## %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
## flatten_lgl, flatten_raw, invoke, list_along, modify, prepend,
## splice
## The following objects are masked from 'package:lazyeval':
##
## as_name, call_modify, call_standardise, expr_label, expr_text,
## f_env, f_env<-, f_label, f_lhs, f_lhs<-, f_rhs, f_rhs<-, f_text,
## is_atomic, is_call, is_formula, is_lang, is_pairlist, missing_arg
## The following object is masked from 'package:data.table':
##
## :=
library('timetk') # time series analysis
# Pacotes para mapas e geolocalização
library('geosphere') # geospatial locations
library('leaflet') # maps
library('leaflet.extras') # maps
library('maps') # maps
##
## Attaching package: 'maps'
## The following object is masked from 'package:purrr':
##
## map
library('fractional') #fraction operations
## Warning: package 'fractional' was built under R version 3.6.3
Bom, uma vez tendo os pacotes instalados, podemos carregá-los a medida da necessidade.
Para iniciar pelo básico do R, vamos mostrar algumas facilidades, como uma simples calculadora.
Falando nisso, eu pelo menos já substituí o excel e a calculadora do Windows para fazer contas no computador, pois você pode ir colocando a expressão diretamente no R e já visualizar a resposta. Veja o exemplo.
Ah, antes disso, você deve ter percebido quando desejo usar a linguagem R, como no caso de instalar os pacotes anterior, acabo usando três crases sequencias e o texto {r}, que é para iniciar um código no R Markdown e para finalizar o código é necessário colocar três crases novamente. Quando estamos na área de código, para incluir comentários, basta colocar um # antes do texto.
Bom, vamos a nossa calculadora no R.
#Os seguintes cálculos podem ser usados diretamente na área do Console ou como um Script na área de Source para verificar os resultados.
1+1 #conta de adição básica
## [1] 2
2-1+4-5 #adição e subtração
## [1] 0
4*2+15 #multiplicação e adição
## [1] 23
10/2-1 #multplicação e subtração
## [1] 4
2**9 #potência, neste caso 2 elevado a 9.
## [1] 512
sqrt(9) #raiz quadrada
## [1] 3
2.5+2.5 #uso de números decimais (usar ponto ao invés da vírgula)
## [1] 5
Frac1 <- fractional(x = (3/11) - (3/11)*((23/4)- (23/4)))
Frac1
## [1] 3/11
Frac2 <- fractional(x = (2/4) * (14/3)) # maxConv = 30)
Frac2
## [1] 7/3
Também conseguimos usar vários tipos de dados. E à partir daqui será comum usarmos a atribuição de valores e dados a uma determinada variável. No R, diferentes de outras linguagens, é possível criar uma variável e atribuir um valor, sem definir o tipo de dado a receber previamente. A sintaxe de atribuição também tem bastante flexibilidade. Vamos aos exemplos:
x <- c(3, 4.5) #atribuindo um vetor de 2 dimensões para a variável x com a função c (que vem de 'Combine')
x #exibindo a variável de 2 dimensões
## [1] 3.0 4.5
#outras formas de fazer atribuição no R
y = c(3, 4.5)
c(3, 4.5)->z
#exibir as variáveis na saída do R Markdown:
y
## [1] 3.0 4.5
z
## [1] 3.0 4.5
Abaixo faremos outras atribuições usando outros tipos de dados
var_string1 <- 'Olá, Mundo!' #atribuição de uma string. Pode usar aspas duplas também.
var_int1 <- 10L #atribuição de um número inteiro (forçada a letra L, justamente para ficar como inteiro e não como numérico)
var_float1 <- 3.14 #atribuição de um número decimal
var_bool1 <- TRUE #atribuição de uma variável lógica (booleana)
var_matrix1 <- matrix(33, nrow = 5, ncol = 5) #atribuição o valor 33 a uma matrix de 5 linhas e 5 colunas
var_complex1 <- 9.99i #atribuição de um número complexo (o R já entende o i como a componente complexa)
var_vector1 <- c(100, 44, 3.14, TRUE, FALSE, var_matrix1) #atribuindo um vetor, com dados inteiros, booleanos, numéricos e de matriz. Neste caso o R converte a variável em um tipo que seja válido para todas as informações do dados. Neste caso "Numeric".
var_dataframe1 <- mtcars #atribuição de um dado do tipo data.frame (um dos mais utilizados no R)
var_timeseries1 <- AirPassengers #atribuição de um TS (Série Temporal)
#Abaixo é uma função para verificar o tipo de dado na variável.
class(var_string1)
## [1] "character"
class(var_int1)
## [1] "integer"
class(var_float1)
## [1] "numeric"
class(var_bool1)
## [1] "logical"
class(var_matrix1)
## [1] "matrix"
class(var_complex1)
## [1] "complex"
class(var_vector1)
## [1] "numeric"
class(var_dataframe1)
## [1] "data.frame"
class(var_timeseries1)
## [1] "ts"
Agora podemos brincar um pouco com outras funcionalidades do R, como sequência e outros tipos de dados.
Daqui em diante, tentarei compartilhar os próprios códigos que usei em sala de aula com os comentários nas próprias linhas de código. Caso você tenha dúvida no uso de alguma funcionalidade, me chame no linkedin: www.linkedin.com/in/jurandir-ventura
Uso de sequência no R:
#Fazendo uma sequência de 30 números de 5 a 10:
my_seq<-seq(5,10,length.out = 30)
#exibindo o resultado
my_seq
## [1] 5.000000 5.172414 5.344828 5.517241 5.689655 5.862069 6.034483
## [8] 6.206897 6.379310 6.551724 6.724138 6.896552 7.068966 7.241379
## [15] 7.413793 7.586207 7.758621 7.931034 8.103448 8.275862 8.448276
## [22] 8.620690 8.793103 8.965517 9.137931 9.310345 9.482759 9.655172
## [29] 9.827586 10.000000
#verificanco o tamanho da variável
length(my_seq)
## [1] 30
#index da sequência criada em my_seq
c<-seq_along(my_seq)
#Sequência de pi (constante), até 10
a<-c(pi:10)
#Sequência de 10 até pi (constante)
b<-c(10:pi)
#exibindo o resultado
a
## [1] 3.141593 4.141593 5.141593 6.141593 7.141593 8.141593 9.141593
b
## [1] 10 9 8 7 6 5 4
Atribuição ou resultados de outros tipos de dados no R (NA, NaN, Inf, NULL)
#NA e NaN (not a number)
d<-0/0
e<-sqrt(-4)
## Warning in sqrt(-4): NaNs produzidos
#Inf e -Inf
f<-19/0
g<--19/0
#NULL (veja que o NULL não aparece na exibição do resultado na variável h)
h<-c(1, NA, NULL, 2)
d
## [1] NaN
e
## [1] NaN
f
## [1] Inf
g
## [1] -Inf
h
## [1] 1 NA 2
Aqui faremos o carregamento de um data.frame (mtcars) e faremos algumas manipulações para atribuição de valores (NULL, NA, etc.), além de fazer alguns testes para saber se a variável é do tipo que estamos perguntando.
#carregar o data.frame na variável test.
test<-mtcars
#exibir o valor da coluna hp do data.frame antes de "limpar com NULL"
test$hp
## [1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52
## [20] 65 97 150 150 245 175 66 91 113 264 175 335 109
#atribuir o valor NULL para toda a coluna hp
test$hp <- NULL
test2<-test$hp
#exibir a coluna hp com os valores em NULL (veja que não tem nada)
test2
## NULL
#atribuir o NA para toda a coluna mpg
test$mpg <- NA
var_na<- NA
var_null<- NULL
var_nan<- NaN
var_inf<- Inf
var_minusinf <- -(Inf)
vector1<-c(var_na, var_null, var_nan, var_inf, var_minusinf)
#testes para saber se o tipo do dado é exatamente o que perguntamos. Veja que o teste verifica cada dimensão do vetor.
is.na(vector1)
## [1] TRUE TRUE FALSE FALSE
is.nan(vector1)
## [1] FALSE TRUE FALSE FALSE
is.null(vector1)
## [1] FALSE
is.infinite(vector1)
## [1] FALSE FALSE TRUE TRUE
is.finite(vector1)
## [1] FALSE FALSE FALSE FALSE
is.null(var_null)
## [1] TRUE
is.na(var_null)
## logical(0)
Agora começaremos a entrar na manipulação de dados, fazendo filtros de conjuntos e subconjuntos.
# Filtrando conjuntos/subconjuntos
test<-mtcars
mtcars[2, 5] #filtrar o valor da linha 2 e coluna 5
## [1] 3.9
mtcars[2:4, 5] #filtrar o valor entre as linhas 2 e 4 coluna 5
## [1] 3.90 3.85 3.08
mtcars[2:4, 5, drop=F]#filtrar o valor entre as linhas 2 e 4 coluna 5, mantendo os labels
## drat
## Mazda RX4 Wag 3.90
## Datsun 710 3.85
## Hornet 4 Drive 3.08
mtcars[2:4, 5:7] #filtrar conjuntos entre as linhas 2 a 4 e colunas 5 a 7
## drat wt qsec
## Mazda RX4 Wag 3.90 2.875 17.02
## Datsun 710 3.85 2.320 18.61
## Hornet 4 Drive 3.08 3.215 19.44
mtcars[8:9, c(1,2,4)] #filrar conjuntos entre linhas 8 a 9 e colunas 1, 2 e 4
## mpg cyl hp
## Merc 240D 24.4 4 62
## Merc 230 22.8 4 95
mtcars[2:4, c("mpg", "wt")]#filtrar conjuntos entre linhas 2 a 4 e colunas de nome 'mpg' e 'wt'
## mpg wt
## Mazda RX4 Wag 21.0 2.875
## Datsun 710 22.8 2.320
## Hornet 4 Drive 21.4 3.215
# Filtrar em todas as colunas valores de mpg >= 15
#opcao 1
Filtro_bool<-mtcars$mpg >= 15
Busca1<-mtcars[Filtro_bool,]
#opcao 2
Busca2<-mtcars[mtcars$mpg >= 15, ]
Agora vamos verificar como manipular data e hora no R. Primeiramente usando a biblioteca padrão do R.
#Experimento com data e hora
dia_texto <- "28/09/2017 T 18:51:30"
dia_date <- as.Date(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia.time1 <- as.POSIXct(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia.time2 <- as.POSIXlt(dia_texto,format="%d/%m/%Y T %H:%M:%S",tz="America/Sao_Paulo")
dia_date
## [1] "2017-09-28"
dia.time1
## [1] "2017-09-28 18:51:30 -03"
dia.time2
## [1] "2017-09-28 18:51:30 -03"
unclass(dia_date)
## [1] 17437
unclass(dia.time1)
## [1] 1506635490
## attr(,"tzone")
## [1] "America/Sao_Paulo"
unclass(dia.time2)
## $sec
## [1] 30
##
## $min
## [1] 51
##
## $hour
## [1] 18
##
## $mday
## [1] 28
##
## $mon
## [1] 8
##
## $year
## [1] 117
##
## $wday
## [1] 4
##
## $yday
## [1] 270
##
## $isdst
## [1] 0
##
## $zone
## [1] "-03"
##
## $gmtoff
## [1] NA
##
## attr(,"tzone")
## [1] "America/Sao_Paulo"
Pausa para a hora da dica. Muitas vezes para manipular hora no R você vai precisar definir o time zone, então abaixo uma linha de código possível de se utilizar nestes momentos, definindo o horário de São Paulo neste caso.
Test1<-0
as.POSIXlt.POSIXct(Test1, tz = "America/Sao_Paulo")
## [1] "1969-12-31 21:00:00 -03"
Bom, com a dica dada, vamos agora fazer algo mais profissional com data e hora, usando o pacote lubridate.
# Usando a bibliota lubridate (várias funcoes prontas)
library(lubridate)
ymd("20191128")
## [1] "2019-11-28"
ymd("2019.11.28")
## [1] "2019-11-28"
#exercicio lubridate
duracao<-duration(260)
duracao2<-duration(260) / 60
duracao3_dia<- duration(1, units="days")
duracao4_dia<- duracao3_dia - duration(60, units="minutes")
## Note: method with signature 'Duration#ANY' chosen for function '-',
## target signature 'Duration#Duration'.
## "ANY#Duration" would also be valid
duracao3a_dia<- ddays(1)
duracao4a_dia<-duracao3a_dia - dminutes(60)
Agora um exercício interessante: calcular o dia que cairá a black friday. Esta data é possível calcular, tendo a informação de que ela cai na quarta sexta-feira do mês de novembro.
Veja essa manipulação na prática.
# Calculo do dia da Black Friday 2018, 2019, 2020, 2021 e 2022
dia1.nov<- ymd(20181101)
dia1.nov<- c(dia1.nov, dia1.nov + years(1), dia1.nov + years(2), dia1.nov + years(3), dia1.nov + years(4))
dia1.nov
## [1] "2018-11-01" "2019-11-01" "2020-11-01" "2021-11-01" "2022-11-01"
dias.Quinta.nov <- dia1.nov + 5 - wday(dia1.nov)
dias.Quinta.nov
## [1] "2018-11-01" "2019-10-31" "2020-11-05" "2021-11-04" "2022-11-03"
dias.Quinta.nov[month(dias.Quinta.nov) < 11] <- dias.Quinta.nov[month(dias.Quinta.nov) < 11] + dweeks(1)
# exibição dos dias da black friday de 2018 a 2022
dias.Quinta.nov
## [1] "2018-11-01" "2019-11-07" "2020-11-05" "2021-11-04" "2022-11-03"
dia.black.friday <-dias.Quinta.nov + dweeks(3) + ddays(1)
dia.black.friday
## [1] "2018-11-23" "2019-11-29" "2020-11-27" "2021-11-26" "2022-11-25"
#Validacao que todos os dias calculados sao sexta-feiras
wday(dia.black.friday, label = TRUE)
## [1] sex sex sex sex sex
## Levels: dom < seg < ter < qua < qui < sex < sáb
Neste tópico vamos mostrar alguns exemplos de manipulação de matrizes. E também converter um Data.frame para uma matriz.
#Primeiro vamos atribuir alguns valores às variáveis a seguir:
a<- c(336634, 19830211, 830, 297982, 3802)
b<- a * 2
c<- b / 3
d<- c + a**2
e<- sqrt(d)
ai<-a
ai<-ai[5:1]
#Agora vamos criar as matrizes
M1<- matrix(c(a,b,c,d,e,ai),nrow=6, ncol=5, byrow = TRUE)
M2<- matrix(c(a,b,c,d,e,ai),nrow=5, ncol=6, byrow = FALSE)
M1
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3.366340e+05 1.983021e+07 830.0000 2.979820e+05 3802.000
## [2,] 6.732680e+05 3.966042e+07 1660.0000 5.959640e+05 7604.000
## [3,] 2.244227e+05 1.322014e+07 553.3333 1.986547e+05 2534.667
## [4,] 1.133227e+11 3.932373e+14 689453.3333 8.879347e+10 14457738.667
## [5,] 3.366343e+05 1.983021e+07 830.3333 2.979823e+05 3802.333
## [6,] 3.802000e+03 2.979820e+05 830.0000 1.983021e+07 336634.000
M2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 336634 673268 2.244227e+05 1.133227e+11 3.366343e+05 3802
## [2,] 19830211 39660422 1.322014e+07 3.932373e+14 1.983021e+07 297982
## [3,] 830 1660 5.533333e+02 6.894533e+05 8.303333e+02 830
## [4,] 297982 595964 1.986547e+05 8.879347e+10 2.979823e+05 19830211
## [5,] 3802 7604 2.534667e+03 1.445774e+07 3.802333e+03 336634
#Fazer a multiplicação de todos os elementos da matriz pelo valor 0.1
M3<-M1*0.1
M3
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3.366340e+04 1.983021e+06 83.00000 2.979820e+04 380.2000
## [2,] 6.732680e+04 3.966042e+06 166.00000 5.959640e+04 760.4000
## [3,] 2.244227e+04 1.322014e+06 55.33333 1.986547e+04 253.4667
## [4,] 1.133227e+10 3.932373e+13 68945.33333 8.879347e+09 1445773.8667
## [5,] 3.366343e+04 1.983021e+06 83.03333 2.979823e+04 380.2333
## [6,] 3.802000e+02 2.979820e+04 83.00000 1.983021e+06 33663.4000
# verificando o tipo de dado na variável attitude (já carregada no R como padrão)
class(attitude)
## [1] "data.frame"
# tamanho dimensional da variável
dim(attitude)
## [1] 30 7
#atribuindo
M4<-as.matrix(attitude[1:5, 2:7])
#Multiplicacao caso 1 (elemento por elemento)
M5<-M1 * M3
M6<-M3 * M1
#Multiplicacao de Matrix A(la, ca) x B(lb, cb) = C(lc, cc)
M7<- M1 %*% M4
M8<- M4 %*% M1
#Comparando se são iguais
M5 == M6 #tudo igual (TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] TRUE TRUE TRUE TRUE TRUE
## [2,] TRUE TRUE TRUE TRUE TRUE
## [3,] TRUE TRUE TRUE TRUE TRUE
## [4,] TRUE TRUE TRUE TRUE TRUE
## [5,] TRUE TRUE TRUE TRUE TRUE
## [6,] TRUE TRUE TRUE TRUE TRUE
#M7 == M8 #matrizes direrentes / non-conformable para comparação
Aqui vamos colocar nomes para linhas de uma matrix. E para relembrar as aulas da professora Vera Marsson (espero não ter errado seu sobrenome “fessora”), vamos colocar o conceito de matrix identidade no final do código.
coeficientes <- matrix(c(50, 0.05, -25.79), ncol = 1)
rownames(coeficientes) <- c("beta01", "beta02", "beta03")
clientes<- matrix(c(1, 10000, 1,
1, 12000, 1,
1, 8000, 0), ncol=3, nrow=3, byrow=T)
rownames(clientes)<- c("Pedro", "Ana", "João")
coeficientes
## [,1]
## beta01 50.00
## beta02 0.05
## beta03 -25.79
clientes
## [,1] [,2] [,3]
## Pedro 1 10000 1
## Ana 1 12000 1
## João 1 8000 0
var.independente<-clientes %*% coeficientes
#matrix identidade (diagonal de valor 1) / A %*% A-1 = I (identidade)
diag(1, nrow = 5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 0 1 0 0 0
## [3,] 0 0 1 0 0
## [4,] 0 0 0 1 0
## [5,] 0 0 0 0 1
Agora entraremos no tópico de amostras, para já começar a pensar em uso mais específico de estatística.
#Amostras e simulações
set.seed(1) # (x) define a amostra aleatória sempre na mesma sequência de acordo com a arquitetura. Assim é possível ter os mesmo resultados. Útil para comparar resultados feitos por pessoas e máquinas diferentes.
#carrega cada letra da palavra triangulos
amostra = c( "T", "R", "I", "A", "N", "G", "U", "L", "O", "S")
#Faz a amostragem, mas sem repetir elemento da amostra
sample(x = amostra, replace = FALSE)
## [1] "O" "A" "U" "T" "R" "N" "I" "S" "G" "L"
#Faz a amostragem, podendo repetir elemento da amostra, pois ele volta para a "população"
sample(x = amostra, replace = TRUE)
## [1] "I" "T" "N" "N" "S" "G" "S" "U" "O" "N"
#Faz a amostragem de 5 elementos
sample(x = amostra, size = 5)
## [1] "N" "O" "T" "G" "S"
#Faz a amostragem de 5 elementos, podendo repetir com uma probabilidade maior (5 vezes) de acontecer a 3a. e última letra. Neste caso definimos a probabilidade de 1 para as demais letras.
sample(x = amostra, size = 10, replace = TRUE,
prob = c(1, 1, 5, 1, 1, 1, 1, 1, 1, 5))
## [1] "O" "S" "S" "G" "S" "I" "A" "L" "A" "I"
Aqui continuamos com a manipulação de dados e amostras. É importante comentar que a função summary é extremamente útil para visualizar os dados de uma amostra, pois já traz o resumo estatístico, tais como: média, mediana, valor mínimo, valor máximo, 1o. quartil, etc.
#Amostra de base de dados data.frame "airquality"
set.seed(3)
airquality
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
## 7 23 299 8.6 65 5 7
## 8 19 99 13.8 59 5 8
## 9 8 19 20.1 61 5 9
## 10 NA 194 8.6 69 5 10
## 11 7 NA 6.9 74 5 11
## 12 16 256 9.7 69 5 12
## 13 11 290 9.2 66 5 13
## 14 14 274 10.9 68 5 14
## 15 18 65 13.2 58 5 15
## 16 14 334 11.5 64 5 16
## 17 34 307 12.0 66 5 17
## 18 6 78 18.4 57 5 18
## 19 30 322 11.5 68 5 19
## 20 11 44 9.7 62 5 20
## 21 1 8 9.7 59 5 21
## 22 11 320 16.6 73 5 22
## 23 4 25 9.7 61 5 23
## 24 32 92 12.0 61 5 24
## 25 NA 66 16.6 57 5 25
## 26 NA 266 14.9 58 5 26
## 27 NA NA 8.0 57 5 27
## 28 23 13 12.0 67 5 28
## 29 45 252 14.9 81 5 29
## 30 115 223 5.7 79 5 30
## 31 37 279 7.4 76 5 31
## 32 NA 286 8.6 78 6 1
## 33 NA 287 9.7 74 6 2
## 34 NA 242 16.1 67 6 3
## 35 NA 186 9.2 84 6 4
## 36 NA 220 8.6 85 6 5
## 37 NA 264 14.3 79 6 6
## 38 29 127 9.7 82 6 7
## 39 NA 273 6.9 87 6 8
## 40 71 291 13.8 90 6 9
## 41 39 323 11.5 87 6 10
## 42 NA 259 10.9 93 6 11
## 43 NA 250 9.2 92 6 12
## 44 23 148 8.0 82 6 13
## 45 NA 332 13.8 80 6 14
## 46 NA 322 11.5 79 6 15
## 47 21 191 14.9 77 6 16
## 48 37 284 20.7 72 6 17
## 49 20 37 9.2 65 6 18
## 50 12 120 11.5 73 6 19
## 51 13 137 10.3 76 6 20
## 52 NA 150 6.3 77 6 21
## 53 NA 59 1.7 76 6 22
## 54 NA 91 4.6 76 6 23
## 55 NA 250 6.3 76 6 24
## 56 NA 135 8.0 75 6 25
## 57 NA 127 8.0 78 6 26
## 58 NA 47 10.3 73 6 27
## 59 NA 98 11.5 80 6 28
## 60 NA 31 14.9 77 6 29
## 61 NA 138 8.0 83 6 30
## 62 135 269 4.1 84 7 1
## 63 49 248 9.2 85 7 2
## 64 32 236 9.2 81 7 3
## 65 NA 101 10.9 84 7 4
## 66 64 175 4.6 83 7 5
## 67 40 314 10.9 83 7 6
## 68 77 276 5.1 88 7 7
## 69 97 267 6.3 92 7 8
## 70 97 272 5.7 92 7 9
## 71 85 175 7.4 89 7 10
## 72 NA 139 8.6 82 7 11
## 73 10 264 14.3 73 7 12
## 74 27 175 14.9 81 7 13
## 75 NA 291 14.9 91 7 14
## 76 7 48 14.3 80 7 15
## 77 48 260 6.9 81 7 16
## 78 35 274 10.3 82 7 17
## 79 61 285 6.3 84 7 18
## 80 79 187 5.1 87 7 19
## 81 63 220 11.5 85 7 20
## 82 16 7 6.9 74 7 21
## 83 NA 258 9.7 81 7 22
## 84 NA 295 11.5 82 7 23
## 85 80 294 8.6 86 7 24
## 86 108 223 8.0 85 7 25
## 87 20 81 8.6 82 7 26
## 88 52 82 12.0 86 7 27
## 89 82 213 7.4 88 7 28
## 90 50 275 7.4 86 7 29
## 91 64 253 7.4 83 7 30
## 92 59 254 9.2 81 7 31
## 93 39 83 6.9 81 8 1
## 94 9 24 13.8 81 8 2
## 95 16 77 7.4 82 8 3
## 96 78 NA 6.9 86 8 4
## 97 35 NA 7.4 85 8 5
## 98 66 NA 4.6 87 8 6
## 99 122 255 4.0 89 8 7
## 100 89 229 10.3 90 8 8
## 101 110 207 8.0 90 8 9
## 102 NA 222 8.6 92 8 10
## 103 NA 137 11.5 86 8 11
## 104 44 192 11.5 86 8 12
## 105 28 273 11.5 82 8 13
## 106 65 157 9.7 80 8 14
## 107 NA 64 11.5 79 8 15
## 108 22 71 10.3 77 8 16
## 109 59 51 6.3 79 8 17
## 110 23 115 7.4 76 8 18
## 111 31 244 10.9 78 8 19
## 112 44 190 10.3 78 8 20
## 113 21 259 15.5 77 8 21
## 114 9 36 14.3 72 8 22
## 115 NA 255 12.6 75 8 23
## 116 45 212 9.7 79 8 24
## 117 168 238 3.4 81 8 25
## 118 73 215 8.0 86 8 26
## 119 NA 153 5.7 88 8 27
## 120 76 203 9.7 97 8 28
## 121 118 225 2.3 94 8 29
## 122 84 237 6.3 96 8 30
## 123 85 188 6.3 94 8 31
## 124 96 167 6.9 91 9 1
## 125 78 197 5.1 92 9 2
## 126 73 183 2.8 93 9 3
## 127 91 189 4.6 93 9 4
## 128 47 95 7.4 87 9 5
## 129 32 92 15.5 84 9 6
## 130 20 252 10.9 80 9 7
## 131 23 220 10.3 78 9 8
## 132 21 230 10.9 75 9 9
## 133 24 259 9.7 73 9 10
## 134 44 236 14.9 81 9 11
## 135 21 259 15.5 76 9 12
## 136 28 238 6.3 77 9 13
## 137 9 24 10.9 71 9 14
## 138 13 112 11.5 71 9 15
## 139 46 237 6.9 78 9 16
## 140 18 224 13.8 67 9 17
## 141 13 27 10.3 76 9 18
## 142 24 238 10.3 68 9 19
## 143 16 201 8.0 82 9 20
## 144 13 238 12.6 64 9 21
## 145 23 14 9.2 71 9 22
## 146 36 139 10.3 81 9 23
## 147 7 49 10.3 69 9 24
## 148 14 20 16.6 63 9 25
## 149 30 193 6.9 70 9 26
## 150 NA 145 13.2 77 9 27
## 151 14 191 14.3 75 9 28
## 152 18 131 8.0 76 9 29
## 153 20 223 11.5 68 9 30
dim(airquality) # verifica o tamanho do data.frame.
## [1] 153 6
summary(airquality) #função muito útil de visualização estatística
## Ozone Solar.R Wind Temp
## Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
## 1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00
## Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
## Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88
## 3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00
## Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
## NA's :37 NA's :7
## Month Day
## Min. :5.000 Min. : 1.0
## 1st Qu.:6.000 1st Qu.: 8.0
## Median :7.000 Median :16.0
## Mean :6.993 Mean :15.8
## 3rd Qu.:8.000 3rd Qu.:23.0
## Max. :9.000 Max. :31.0
##
#10 primeiros
head(airquality, n= 10)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
## 7 23 299 8.6 65 5 7
## 8 19 99 13.8 59 5 8
## 9 8 19 20.1 61 5 9
## 10 NA 194 8.6 69 5 10
#10 aleatórios
S1<-head(sample(x = airquality, replace = TRUE), n= 10)
# faz sorteio das colunas, mas não das linhas
S1
## Month Solar.R Temp Temp.1 Solar.R.1 Wind
## 1 5 190 67 67 190 7.4
## 2 5 118 72 72 118 8.0
## 3 5 149 74 74 149 12.6
## 4 5 313 62 62 313 11.5
## 5 5 NA 56 56 NA 14.3
## 6 5 NA 66 66 NA 14.9
## 7 5 299 65 65 299 8.6
## 8 5 99 59 59 99 13.8
## 9 5 19 61 61 19 20.1
## 10 5 194 69 69 194 8.6
S2<-airquality[runif(10, 1, 153),]
# agora faz o aleatorio das linhas, com colunas fixas
S2
## Ozone Solar.R Wind Temp Month Day
## 88 52 82 12.0 86 7 27
## 96 78 NA 6.9 86 8 4
## 78 35 274 10.3 82 7 17
## 77 48 260 6.9 81 7 16
## 82 16 7 6.9 74 7 21
## 85 80 294 8.6 86 7 24
## 132 21 230 10.9 75 9 9
## 127 91 189 4.6 93 9 4
## 17 34 307 12.0 66 5 17
## 107 NA 64 11.5 79 8 15
S3<-airquality[sample(row.names(airquality), 10),]
# outra forma de fazer o aleatorio das linhas, com colunas fixas
S4<-sample_n(airquality, 10)
# outra forma
S4
## Ozone Solar.R Wind Temp Month Day
## 1 11 320 16.6 73 5 22
## 2 97 272 5.7 92 7 9
## 3 71 291 13.8 90 6 9
## 4 18 65 13.2 58 5 15
## 5 27 175 14.9 81 7 13
## 6 NA 291 14.9 91 7 14
## 7 45 252 14.9 81 5 29
## 8 20 81 8.6 82 7 26
## 9 23 220 10.3 78 9 8
## 10 135 269 4.1 84 7 1
linhas.idx<-seq_len(nrow(airquality)) #cria a sequência com o número de linhas do airquality
linhas.idx
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
## [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
## [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
## [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
## [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
## [91] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
## [109] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
## [127] 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## [145] 145 146 147 148 149 150 151 152 153
# mais uma forma de se fazer a amostra
linhas.sample<- sample(linhas.idx, 10)
S5<-airquality[linhas.sample,]
S5
## Ozone Solar.R Wind Temp Month Day
## 127 91 189 4.6 93 9 4
## 101 110 207 8.0 90 8 9
## 136 28 238 6.3 77 9 13
## 138 13 112 11.5 71 9 15
## 68 77 276 5.1 88 7 7
## 33 NA 287 9.7 74 6 2
## 19 30 322 11.5 68 5 19
## 116 45 212 9.7 79 8 24
## 135 21 259 15.5 76 9 12
## 65 NA 101 10.9 84 7 4
Agora começamos a fazer distriuição de dados e assim podemos pensar em plotar alguns gráficos para visualizar correlações e o início do conceito de regressão linear.
#simulações
rm(list=ls())
set.seed(19)
valor.x<-rnorm(100, 0, 1)
valor.E<-rnorm(100,0,2)
Beta.0<-rep(0.5,100)
Beta.1<-rep(2.0,100)
valor.y<-Beta.0 + Beta.1*valor.x + valor.E
plot(x = valor.x, y = valor.y)
#plot_ly(x = valor.x, y = valor.y, type = "scatter")
#segmento.reta<-plot_ly(x = valor.x, y = valor.y, type = "scatter")
#adicionando um segmento de reta simples (não é regressão ainda)
#add_segments(segmento.reta,x=-2.5, xend = 2.9, y = -6, yend = 8.2)
#fazendo com regressão
regressao <- lm (formula = x ~ y,
data = data.frame(x=valor.x, y=valor.y))
Agora para os apaixonados por linguagem de programação e os famosos IF THEN ELSE, vamos mostrar um pouco das sintaxes de laços em R e já implementar o conceito de função, pois é onde utilizamos os laços de forma mais prática.
# O primeiro exemplo de laço é usando FOR.
#Para isso, vamos usar o dado AirPassenges (já carregado no R)
rm(list=ls())
class(AirPassengers) #é um TimeSeries (TS)
## [1] "ts"
#Opcao 1
Count1<-0
Result1<-c()
for (i in AirPassengers){
Count1<-Count1 + i
Result1<- c(Result1, Count1)
print(paste(i, Count1))
}
## [1] "112 112"
## [1] "118 230"
## [1] "132 362"
## [1] "129 491"
## [1] "121 612"
## [1] "135 747"
## [1] "148 895"
## [1] "148 1043"
## [1] "136 1179"
## [1] "119 1298"
## [1] "104 1402"
## [1] "118 1520"
## [1] "115 1635"
## [1] "126 1761"
## [1] "141 1902"
## [1] "135 2037"
## [1] "125 2162"
## [1] "149 2311"
## [1] "170 2481"
## [1] "170 2651"
## [1] "158 2809"
## [1] "133 2942"
## [1] "114 3056"
## [1] "140 3196"
## [1] "145 3341"
## [1] "150 3491"
## [1] "178 3669"
## [1] "163 3832"
## [1] "172 4004"
## [1] "178 4182"
## [1] "199 4381"
## [1] "199 4580"
## [1] "184 4764"
## [1] "162 4926"
## [1] "146 5072"
## [1] "166 5238"
## [1] "171 5409"
## [1] "180 5589"
## [1] "193 5782"
## [1] "181 5963"
## [1] "183 6146"
## [1] "218 6364"
## [1] "230 6594"
## [1] "242 6836"
## [1] "209 7045"
## [1] "191 7236"
## [1] "172 7408"
## [1] "194 7602"
## [1] "196 7798"
## [1] "196 7994"
## [1] "236 8230"
## [1] "235 8465"
## [1] "229 8694"
## [1] "243 8937"
## [1] "264 9201"
## [1] "272 9473"
## [1] "237 9710"
## [1] "211 9921"
## [1] "180 10101"
## [1] "201 10302"
## [1] "204 10506"
## [1] "188 10694"
## [1] "235 10929"
## [1] "227 11156"
## [1] "234 11390"
## [1] "264 11654"
## [1] "302 11956"
## [1] "293 12249"
## [1] "259 12508"
## [1] "229 12737"
## [1] "203 12940"
## [1] "229 13169"
## [1] "242 13411"
## [1] "233 13644"
## [1] "267 13911"
## [1] "269 14180"
## [1] "270 14450"
## [1] "315 14765"
## [1] "364 15129"
## [1] "347 15476"
## [1] "312 15788"
## [1] "274 16062"
## [1] "237 16299"
## [1] "278 16577"
## [1] "284 16861"
## [1] "277 17138"
## [1] "317 17455"
## [1] "313 17768"
## [1] "318 18086"
## [1] "374 18460"
## [1] "413 18873"
## [1] "405 19278"
## [1] "355 19633"
## [1] "306 19939"
## [1] "271 20210"
## [1] "306 20516"
## [1] "315 20831"
## [1] "301 21132"
## [1] "356 21488"
## [1] "348 21836"
## [1] "355 22191"
## [1] "422 22613"
## [1] "465 23078"
## [1] "467 23545"
## [1] "404 23949"
## [1] "347 24296"
## [1] "305 24601"
## [1] "336 24937"
## [1] "340 25277"
## [1] "318 25595"
## [1] "362 25957"
## [1] "348 26305"
## [1] "363 26668"
## [1] "435 27103"
## [1] "491 27594"
## [1] "505 28099"
## [1] "404 28503"
## [1] "359 28862"
## [1] "310 29172"
## [1] "337 29509"
## [1] "360 29869"
## [1] "342 30211"
## [1] "406 30617"
## [1] "396 31013"
## [1] "420 31433"
## [1] "472 31905"
## [1] "548 32453"
## [1] "559 33012"
## [1] "463 33475"
## [1] "407 33882"
## [1] "362 34244"
## [1] "405 34649"
## [1] "417 35066"
## [1] "391 35457"
## [1] "419 35876"
## [1] "461 36337"
## [1] "472 36809"
## [1] "535 37344"
## [1] "622 37966"
## [1] "606 38572"
## [1] "508 39080"
## [1] "461 39541"
## [1] "390 39931"
## [1] "432 40363"
View(Result1)
#Opcao 2
Count2<-AirPassengers[1]
for (i in 2:144){
Count2[i]<- Count2[i-1] + AirPassengers[i]
}
View(Count2)
As funções tem uma sintaxe simples de implementação, pois basta atribuir da seguinte forma:
Nome_da_funcao <- function(argument1, argument2, argumentn){ código da função return (aqui você coloca o que quer como saída da função) }
Veja alguns exemplos e agora sim usaremos IF :-).
# Teste de função 1 (usando pronta)
FuncFatorial<-function(N){
OutFactorial<-factorial(x = N)
return(OutFactorial)
}
Test<-FuncFatorial(3)
Test
## [1] 6
# Teste de função 2 (Fatorial caseiro)
FuncFatorial1<-function(N){
if (N<0) {
stop("Não permitido número negativo")
} else {
aux<-1
while (N >= 1){
aux<-aux*N
N<-N-1
}
}
return(aux)
}
FuncFatorial1(5)
## [1] 120
#Função de inversão opção 1
FuncInvert1<-function(N){
N[length(N):1]
}
FuncInvert1(2:15)
## [1] 15 14 13 12 11 10 9 8 7 6 5 4 3 2
#Função de inversão opção 2
FuncInvert2<-function(N){
r<-c()
for (j in seq_along(N)){
r<-c(N[j],r)
}
return(r)
}
FuncInvert2(2:15)
## [1] 15 14 13 12 11 10 9 8 7 6 5 4 3 2
LoopAcc<-function(Vector1){
Count1<-0 #quando for somatória de inteiro, não usar c()
Result1<-c()
for (i in Vector1){
Count1<-Count1 + i
Result1<- c(Result1, Count1)
}
return(Result1)
}
debugonce(LoopAcc)
#Testes da função, com opção de debug.
LoopAcc(2:4)
## debugging in: LoopAcc(2:4)
## debug em <text>#50: {
## Count1 <- 0
## Result1 <- c()
## for (i in Vector1) {
## Count1 <- Count1 + i
## Result1 <- c(Result1, Count1)
## }
## return(Result1)
## }
## debug em <text>#51: Count1 <- 0
## debug em <text>#52: Result1 <- c()
## debug em <text>#53: for (i in Vector1) {
## Count1 <- Count1 + i
## Result1 <- c(Result1, Count1)
## }
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#54: Count1 <- Count1 + i
## debug em <text>#55: Result1 <- c(Result1, Count1)
## debug em <text>#57: return(Result1)
## exiting from: LoopAcc(2:4)
## [1] 2 5 9
Abaixo mostramos mais algumas funções para environment e que podem ser úteis em algum momento, em especial se você usa o R em um ambiente de produção.
#Exemplos de funções de environment
e1 = new.env()
assign("var1", 1, envir = e1 )
get("var1", envir = e1)
## [1] 1
exists("var1", envir = e1)
## [1] TRUE
rm("var1", envir = e1)
exists("var1", envir = e1)
## [1] FALSE
rm(e1)
globalenv()
## <environment: R_GlobalEnv>
.GlobalEnv
## <environment: R_GlobalEnv>
environment()
## <environment: R_GlobalEnv>
Agora podemos usar funções para outras finalidades, como manipulação de arquivos, conforme algumas linhas de código abaixo.
#diretórios
#aqui verificamos qual é o diretório de trabalho que o R usa. Assim quando usamos arquivos, seja para salvar ou abrir, usamos este diretório como "Default".
setwd("C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language")
getwd()
## [1] "C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language"
#Podemos mudar o diretório de trabalho, com a função abaixo:
#setwd("C:/Users/logonrmlocal/data")
#Deixei comentado com #, só pra não mudar nada neste momento. Mas fica a dica.
#Aqui criamos a pasta JVdata no diretório de trabalho, caso não exista.
if(!file.exists('JVdata')){
dir.create('JVdata')
}
file.url = 'https://storage.googleapis.com/ds-publico/IE1-04.xlsx'
file.local = file.path('./JVdata', basename(file.url))
download.file(url = file.url, destfile = file.local , mode='wb')
#Usando Função para baixar arquivo
DownloadFromWeb<-function(URLAux){
if(!file.exists('JVdata')){
dir.create('JVdata')
}
file.local <- file.path('./JVdata', basename(URLAux))
download.file(url = URLAux, destfile = file.local , mode='wb')
}
DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas.csv')
DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas-Partidas.csv')
DownloadFromWeb('https://storage.googleapis.com/ds-publico/Copas-Jogadores.csv')
#Funções para ler tabela
library(readr)
read.table(file = 'JVData/Copas.csv', sep=',',header = TRUE)
## Year Country Winner Runners.Up Third Fourth
## 1 1930 Uruguay Uruguay Argentina USA Yugoslavia
## 2 1934 Italy Italy Czechoslovakia Germany Austria
## 3 1938 France Italy Hungary Brazil Sweden
## 4 1950 Brazil Uruguay Brazil Sweden Spain
## 5 1954 Switzerland Germany FR Hungary Austria Uruguay
## 6 1958 Sweden Brazil Sweden France Germany FR
## 7 1962 Chile Brazil Czechoslovakia Chile Yugoslavia
## 8 1966 England England Germany FR Portugal Soviet Union
## 9 1970 Mexico Brazil Italy Germany FR Uruguay
## 10 1974 Germany Germany FR Netherlands Poland Brazil
## 11 1978 Argentina Argentina Netherlands Brazil Italy
## 12 1982 Spain Italy Germany FR Poland France
## 13 1986 Mexico Argentina Germany FR France Belgium
## 14 1990 Italy Germany FR Argentina Italy England
## 15 1994 USA Brazil Italy Sweden Bulgaria
## 16 1998 France France Brazil Croatia Netherlands
## 17 2002 Korea/Japan Brazil Germany Turkey Korea Republic
## 18 2006 Germany Italy France Germany Portugal
## 19 2010 South Africa Spain Netherlands Germany Uruguay
## 20 2014 Brazil Germany Argentina Netherlands Brazil
## GoalsScored QualifiedTeams MatchesPlayed Attendance
## 1 70 13 18 590.549
## 2 70 16 17 363.000
## 3 84 15 18 375.700
## 4 88 13 22 1.045.246
## 5 140 16 26 768.607
## 6 126 16 35 819.810
## 7 89 16 32 893.172
## 8 89 16 32 1.563.135
## 9 95 16 32 1.603.975
## 10 97 16 38 1.865.753
## 11 102 16 38 1.545.791
## 12 146 24 52 2.109.723
## 13 132 24 52 2.394.031
## 14 115 24 52 2.516.215
## 15 141 24 52 3.587.538
## 16 171 32 64 2.785.100
## 17 161 32 64 2.705.197
## 18 147 32 64 3.359.439
## 19 145 32 64 3.178.856
## 20 171 32 64 3.386.810
#Funções para ler tabela. Código gerado pelo Import DataSet... (Opção em Files, selecionando direto o arquivo)
library(readr)
Copas_Jogadores <- read_csv("JVdata/Copas-Jogadores.csv")
## Parsed with column specification:
## cols(
## RoundID = col_double(),
## MatchID = col_double(),
## `Team Initials` = col_character(),
## `Coach Name` = col_character(),
## `Line-up` = col_character(),
## `Shirt Number` = col_double(),
## `Player Name` = col_character(),
## Position = col_character(),
## Event = col_character()
## )
View(Copas_Jogadores)
Copas_Partidas <- read_csv("JVdata/Copas-Partidas.csv")
## Parsed with column specification:
## cols(
## .default = col_character(),
## Year = col_double(),
## `Home Team Goals` = col_double(),
## `Away Team Goals` = col_double(),
## Attendance = col_double(),
## `Half-time Home Goals` = col_double(),
## `Half-time Away Goals` = col_double(),
## RoundID = col_double(),
## MatchID = col_double()
## )
## See spec(...) for full column specifications.
View(Copas_Partidas)
#Funções específicas para Excel
library(readxl)
#read_excel()
DownloadFromWeb('https://storage.googleapis.com/ds-publico/cameras.baltimore.xlsx')
library(readxl)
getwd()
## [1] "C:/Users/BRJUVEN1/iCloudDrive/Documents/GitHub/R_Language"
cameras_baltimore <- read_excel("JVdata/cameras.baltimore.xlsx")
View(cameras_baltimore)
#Aqui usamos algumas funções para manipular informações dos arquivos. Como máximo e mínimo.
View(Norte<-cameras_baltimore[which.max(cameras_baltimore$Lat),])
View(Sul<-cameras_baltimore[which.min(cameras_baltimore$Lat),])
View(Leste<-cameras_baltimore[which.max(cameras_baltimore$Long),])
View(Oeste<-cameras_baltimore[which.min(cameras_baltimore$Long),])
#Lendo um arquivo de imagem do tipo jpg.
read_file('JVdata/RLogo.jpg')
## [1] "<ff><d8><ff><e0>"
Um operador muito comum de uso no R é o PIPE, que facilita a visualização do código. Veja alguns exemplos.
#Pipe - Usado para mover resultados de funções para outras em cadeia
#melhora a visualização do código em relação a outras linguagens
head(starwars)
## # A tibble: 6 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Dart… 202 136 none white yellow 41.9 male mascu…
## 5 Leia… 150 49 brown light brown 19 fema… femin…
## 6 Owen… 178 120 brown, gr… light blue 52 male mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
starwars %>% head(.)
## # A tibble: 6 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Dart… 202 136 none white yellow 41.9 male mascu…
## 5 Leia… 150 49 brown light brown 19 fema… femin…
## 6 Owen… 178 120 brown, gr… light blue 52 male mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
10 %>% head(starwars, .)
## # A tibble: 10 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Dart… 202 136 none white yellow 41.9 male mascu…
## 5 Leia… 150 49 brown light brown 19 fema… femin…
## 6 Owen… 178 120 brown, gr… light blue 52 male mascu…
## 7 Beru… 165 75 brown light blue 47 fema… femin…
## 8 R5-D4 97 32 <NA> white, red red NA none mascu…
## 9 Bigg… 183 84 black light brown 24 male mascu…
## 10 Obi-… 182 77 auburn, w… fair blue-gray 57 male mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
starwars %>% head(., 10)
## # A tibble: 10 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Dart… 202 136 none white yellow 41.9 male mascu…
## 5 Leia… 150 49 brown light brown 19 fema… femin…
## 6 Owen… 178 120 brown, gr… light blue 52 male mascu…
## 7 Beru… 165 75 brown light blue 47 fema… femin…
## 8 R5-D4 97 32 <NA> white, red red NA none mascu…
## 9 Bigg… 183 84 black light brown 24 male mascu…
## 10 Obi-… 182 77 auburn, w… fair blue-gray 57 male mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
starwars %>% head(10)
## # A tibble: 10 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 Luke… 172 77 blond fair blue 19 male mascu…
## 2 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 3 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 4 Dart… 202 136 none white yellow 41.9 male mascu…
## 5 Leia… 150 49 brown light brown 19 fema… femin…
## 6 Owen… 178 120 brown, gr… light blue 52 male mascu…
## 7 Beru… 165 75 brown light blue 47 fema… femin…
## 8 R5-D4 97 32 <NA> white, red red NA none mascu…
## 9 Bigg… 183 84 black light brown 24 male mascu…
## 10 Obi-… 182 77 auburn, w… fair blue-gray 57 male mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
#outro exemplo de pipe
starwars %>%
filter(species == "Droid")
## # A tibble: 6 x 14
## name height mass hair_color skin_color eye_color birth_year sex gender
## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 C-3PO 167 75 <NA> gold yellow 112 none mascu…
## 2 R2-D2 96 32 <NA> white, bl… red 33 none mascu…
## 3 R5-D4 97 32 <NA> white, red red NA none mascu…
## 4 IG-88 200 140 none metal red 15 none mascu…
## 5 R4-P… 96 NA none silver, r… red, blue NA none femin…
## 6 BB8 NA NA none none black NA none mascu…
## # … with 5 more variables: homeworld <chr>, species <chr>, films <list>,
## # vehicles <list>, starships <list>
#exemplo já direcionando o resultado para a função View()
starwars %>%
filter(species == "Droid") %>%
View()
#Pipe para fazer Agregação
starwars %>%
group_by(species) %>%
summarise(
j = n(),
mass = mean(mass, na.rm = TRUE)
) %>%
filter(j > 1)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 9 x 3
## species j mass
## <chr> <int> <dbl>
## 1 Droid 6 69.8
## 2 Gungan 3 74
## 3 Human 35 82.8
## 4 Kaminoan 2 88
## 5 Mirialan 2 53.1
## 6 Twi'lek 2 55
## 7 Wookiee 2 124
## 8 Zabrak 2 80
## 9 <NA> 4 48
Já vimos alguns gráficos anteriormente, mas agora vamos dedicar um tempo maior para eles. Veja abaixo alguns códigos de exemplos para manipulação de dados e geração de gráficos.
# Fazendo gráficos
#Ajustando o TimeZone para trabalhar com horário
x = -10:10
plot(x=x,y=x**2,main='Parábola')
plot(x=x,y=x**2,main='Parábola', type = 'l')
plot(x=x,y=x**2,main='Parábola', type = 'p')
plot(x=x,y=x**2,main='Parábola', type = 'b')
plot(x=x,y=x**2,main='Parábola', type = 'o')
plot(x=x,y=x**2,main='Parábola', type = 'h')
plot(x=x,y=x**2,main='Parábola', type = 's')
head(cars)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
plot(x=cars$speed, y = cars$dist)
plot(cars$speed, cars$dist)
plot(cars)
airquality %>%
# filter(Month == 5) %>%
select(Wind, Ozone) %>%
lm(Ozone ~ Wind, data=.)->regressao
regressao
##
## Call:
## lm(formula = Ozone ~ Wind, data = .)
##
## Coefficients:
## (Intercept) Wind
## 96.873 -5.551
abline(regressao, col="red")
#fazendo linha de regressão na mão, sem o abline
xi = 0
yi = regressao$coefficients["(Intercept)"] + regressao$coefficients[2]*xi
xf = 18
yf = regressao$coefficients["(Intercept)"] + regressao$coefficients[2]*xf
lines(x = c(xi, xf), y=c(yi, yf), col="blue")
predict(regressao, newdata = data.frame(Wind=c(0,13,18)))
## 1 2 3
## 96.872895 24.710897 -3.043717
predict(regressao, newdata = data.frame(Wind=c(0:10)))
## 1 2 3 4 5 6 7 8
## 96.87289 91.32197 85.77105 80.22013 74.66920 69.11828 63.56736 58.01643
## 9 10 11
## 52.46551 46.91459 41.36367
# Usando o plot_ly
#Monta o gráfico e armazena em p
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
plot_ly(data = airquality,
x = ~Wind, y = ~Ozone,
text = ~paste0(Day, '/', Month),
type = 'scatter', mode ='markers') -> p
#Exibe p
print( p )
## Warning: Ignoring 37 observations
## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
#?plotly
add_segments(p, x=xi, xend = xf, y=yi, yend = yf, color=I("blue"))
## Warning: Ignoring 37 observations
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
Este portfólio não tem o objetivo de torná-lo um especialista, mas espero que tenha conseguido aprender algo até o momento.
Para facilitar o uso do R, recomendo fortemente a fazer os exercícios interativos de R, usando o próprio R Studio, são 13 temas que vão reforçar os tópicos que mencionei neste documento. Abaixo vou colocar as linhas de códigos para realizar o exercício. Caso você não tenha rodado todo o R Markdown, então coloquei algumas linhas adicionais, que já foram usadas em tópicos anteriores, mas creio que funcionará no seu computador.
No final você pode direcionar sua conclusão para uma página WEB, caso seja aluno da FIAP, turma 11IA. Esta é uma funcionalidade sensacional que o mestre ELTHON implementou.
Tive a felicidade de poder fazer os 13 tópicos de exercícios e com certeza eles me ajudaram bastante a desenvolver este documento.
#Set TimeZone
Test1<-0
as.POSIXlt.POSIXct(Test1, tz = "America/Sao_Paulo")
## [1] "1969-12-31 21:00:00 -03"
# Instala pacote swirl
#install.packages("swirl")
#library(swirl)
# Instala curso
#library(swirl)
#uninstall_course('Aprenda_R_no_R')
#install_course_github('elthonf','Aprenda_R_no_R')
# Inicia os cursos interativos
#swirl()
# Inicia os cursos interativos para novas sessões
#library(swirl)
#select_language(language = 'portuguese')
#swirl()
# Outros comandos
#library(swirl)
#bye()
#info()
Sys.setlocale("LC_ALL", 'en_US.UTF-8')
## Warning in Sys.setlocale("LC_ALL", "en_US.UTF-8"): SO informa que a requisição
## para definir o locale como 'en_US.UTF-8' não pode ser honrada
## [1] ""
https://drive.google.com/drive/folders/1frXTDapAi-yfWjGdxzdvB3iB8ZkUSm4P?usp=sharing
OUTRAS INFORMAÇÕES Como curiosidade e para testar meus conhecimentos fiz um avaliação no Linkedin para R. É bem interessante, pois são diversar perguntas com alternativas e muito bom para se auto-avaliar. Infelizmente não passei quando eu fiz, pois ainda nem tinha começado este portfólio e as aulas ainda estavam na metade. Poderei fazer um novo teste daqui a 3 meses (meados de março de 2020), assim tentarei atualizar esta informação aqui, caso eu tenha atingido os 70% exigidos pelo Linkedin :-). Caso você tenha lido todo o portfólio, creio que poderá fazer o teste.
SITES IMPORTANTES
CRAN – Manuais oficiais http://cran.r-project.org
Uma introdução ao R http://cran.r-project.org/doc/manuals/r-release/R-intro.html
R Data Import/Export http://cran.r-project.org/doc/manuals/r-release/R-data.html
Writing R Extensions: Como escrever e organizar pacotes R http://cran.r-project.org/doc/manuals/r-release/R-exts.html
R Installation and Administration: Como compilar o R a partir do Código fonte http://cran.r-project.org/doc/manuals/r-release/R-admin.html
R Internals: Manuais da estrutura de baixo nível para desenvolvedores R e membros do “R Core” http://cran.r-project.org/doc/manuals/r-release/R-ints.html
Definição da linguagem R: Documentos para desenvolvedores http://cran.r-project.org/doc/manuals/r-release/R-lang.html
Título: Como Mentir com Estatística Autor: Darrell Huff